package com.tangyuan.oss.ossMinio.adapter;

import com.tangyuan.oss.adapter.StorageAdapter;
import com.tangyuan.oss.entity.FileInfo;
import com.tangyuan.oss.ossMinio.util.MinioUtil;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;

/**
 * @Author: TangYuan
 * @Date: 2024/6/3 16:01
 * @描述: minio文件管理适配器
 */
public class MinioStorageAdapter implements StorageAdapter {
    
    /** url */
    @Value("${storage.service.minio.url}")
    private String url;
    
    @Resource
    private MinioUtil minioUtil;
    
    /**
     * 列出所有桶
     * @return {@link List <String>}
     * @Date: 2024/6/3 下午2:01
     */
    @Override
    @SneakyThrows
    public List<String> getAllBucket() {
        return minioUtil.getAllBucket();
    }
    
    /**
     * 创建桶
     * @param bucketName 桶名
     * @Date: 2024/6/3 下午1:55
     */
    @Override
    @SneakyThrows
    public void createBucket(String bucketName) {
        minioUtil.createBucket(bucketName);
    }
    
    /**
     * 删除桶
     * @param bucketName 桶名
     * @Date: 2024/6/3 下午2:15
     */
    @Override
    @SneakyThrows
    public void deleteBucket(String bucketName) {
        minioUtil.deleteBucket(bucketName);
    }
    
    /**
     * 上传文件
     * @param multipartFile 文件流
     * @param bucketName    桶名
     * @param fileName      文件名
     * @Date: 2024/6/3 下午1:59
     */
    @Override
    @SneakyThrows
    public void uploadFile(MultipartFile multipartFile, String bucketName, String fileName) {
        minioUtil.uploadFile(multipartFile.getInputStream(), bucketName, fileName);
    }
    
    /**
     * 列出桶中所有文件
     * @param bucketName 桶名
     * @return {@link List<FileInfo>}
     * @Date: 2024/6/3 下午2:01
     */
    @Override
    @SneakyThrows
    public List<FileInfo> getAllFile(String bucketName) {
        return minioUtil.getAllFile(bucketName);
    }
    
    /**
     * 下载文件
     * @param bucketName 桶名
     * @param fileName   文件名
     * @return {@link InputStream}
     * @Date: 2024/6/3 下午2:15
     */
    @Override
    @SneakyThrows
    public InputStream downLoad(String bucketName, String fileName) {
        return minioUtil.downLoad(bucketName, fileName);
    }
    
    /**
     * 删除文件
     * @param bucketName 桶名
     * @param fileName   文件名
     * @Date: 2024/6/3 下午2:15
     */
    @Override
    @SneakyThrows
    public void deleteFile(String bucketName, String fileName) {
        minioUtil.deleteFile(bucketName, fileName);
    }
    
    /**
     * 获取文件地址
     * @param bucketName 桶名
     * @param fileName   文件名
     * @return {@link String}
     * @Date: 2024/6/3 下午4:25
     */
    @Override
    public String getUrl(String bucketName, String fileName) {
        return url + "/" + bucketName + "/" + fileName;
    }
    
}
